/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package investigaciones_itm.Presupuestos;

import com.sun.rave.web.ui.appbase.AbstractPageBean;
import itm.bo.presupuestos.PresupuestosBO;
import itm.vo.presupuestos.rubroProyectoVO;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.FacesException;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.servlet.http.HttpSession;

/**
 * <p>Page bean that corresponds to a similarly named JSP page.  This
 * class contains component definitions (and initialization code) for
 * all components that you have defined on this page, as well as
 * lifecycle methods and event handlers where you may add behavior
 * to respond to incoming events.</p>
 *
 * @version RubroTiempoAprobado.java
 * @version Created on 30/06/2009, 09:02:08 AM
 * @author jimmy
 */
public class RubroTiempoAprobado extends AbstractPageBean {

    private List<rubroProyectoVO> listaRubros = new ArrayList<rubroProyectoVO>();
    private long proyecto;
    private PresupuestosBO presupuestosBO;
    private int duracion;
    private String tipoPeriodo;
    private HttpSession sesion;
    private double valorPeriodo;
    private double presupApro;
    private double presupDistri;
    private static final String ID_SESSION_RUBRO_TIEMPO_APROBADO = "rubro.tiempo.aprobado";
    private boolean swInput;
    private boolean boolInpuText;
    private boolean boolBotonGuardar;
    private boolean boolBotonSiguiente;
    private boolean boolPresupuesto;

    // </editor-fold>
    /**
     * <p>Construct a new Page bean instance.</p>
     */
    public RubroTiempoAprobado() {
        this.inicializar();
    }

    protected void inicializar() {
        this.inicializarObjetos();
        this.setBoolBotonSiguiente(true);
        this.cargarVariablesSesion();
        this.cargarVariablesSesionLocal();
        this.cargarRubros();
    }

    protected void inicializarObjetos() {
        presupuestosBO = new PresupuestosBO();

    }

    protected void cargarVariablesSesionLocal() {

        if (this.getSesion().getAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "listaRubros") != null) {
            this.setListaRubros((List<rubroProyectoVO>) this.getSesion().getAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "listaRubros"));
        }
        if (this.getSesion().getAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "swInput") != null) {
            this.setSwInput((Boolean) this.getSesion().getAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "swInput"));
        }
        if (this.getSesion().getAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "boolBotonGuardar") != null) {
            this.setBoolBotonGuardar((Boolean) this.getSesion().getAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "boolBotonGuardar"));
        }
        if (this.getSesion().getAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "boolBotonSiguiente") != null) {
            this.setBoolBotonSiguiente((Boolean) this.getSesion().getAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "boolBotonSiguiente"));
        }
        if (this.getSesion().getAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "boolInpuText") != null) {
            this.setBoolInpuText((Boolean) this.getSesion().getAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "boolInpuText"));
        }
        if (this.getSesion().getAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "presupApro") != null) {
            this.setPresupApro((Double) this.getSesion().getAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "presupApro"));
        }
        if (this.getSesion().getAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "boolPresupuesto") != null) {
            this.setBoolPresupuesto((Boolean) this.getSesion().getAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "boolPresupuesto"));
        }
    }

    protected void cargarVariablesSesion() {
        if (this.getSesion().getAttribute("rubro.fuente.aprobado" + "listaRubros") != null) {
            this.setListaRubros((List<rubroProyectoVO>) this.getSesion().getAttribute("rubro.fuente.aprobado" + "listaRubros"));
        }
        if (this.getSesion().getAttribute("rubro.fuente.aprobado" + "presuApr") != null) {
            this.setPresupApro((Double) this.getSesion().getAttribute("rubro.fuente.aprobado" + "presuApr"));
        }
        if (this.getSesion().getAttribute("rubro.fuente.aprobado" + "proyecto") != null) {
            this.setProyecto((Long) this.getSesion().getAttribute("rubro.fuente.aprobado" + "proyecto"));
        }

    }

    protected void cargarRubros() {
        try {
            if (this.getSesion().getAttribute("rubro.fuente.aprobado" + "status") == null) {
                if (this.isSwInput() == false) {
                    listaRubros = presupuestosBO.listarPresupFteApr(proyecto);
                    this.cargarPeriodos();
                }
            } else {
                this.calcularPresuApr();
                this.setBoolBotonGuardar(true);
                this.setBoolBotonSiguiente(false);
                this.setBoolInpuText(true);
                this.getSesion().setAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "boolBotonGuardar", this.isBoolBotonGuardar());
                this.getSesion().setAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "boolBotonSiguiente", this.isBoolBotonSiguiente());
                this.getSesion().setAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "boolInpuText", this.isBoolInpuText());
            }
            this.setDuracion(presupuestosBO.duracionProyectoApr(proyecto));
            this.setTipoPeriodo(presupuestosBO.tipoPeriodoProyApr(proyecto));
            this.calcularTotal(null, null, 0);
            this.calcularPresupuestos();
        } catch (Exception ex) {
            Logger.getLogger(RubroTiempoAprobado.class.getName()).log(Level.SEVERE, null, ex);
            error("Error al listar rubros por proyecto aprobado");
        }
    }

    protected void cargarPeriodos() {
        try {
            listaRubros = presupuestosBO.listarPeriodoProyApr(proyecto, listaRubros);
        } catch (Exception ex) {
            Logger.getLogger(RubroTiempoAprobado.class.getName()).log(Level.SEVERE, null, ex);
            error("Error al obtener los periodos");
        }
    }

    protected void calcularTotal(UIParameter idRubroParam, UIParameter periodoParam, double valorAnteriorPeriodo) {

        double totalPeriodo = 0;
        double totalPeriodoEst = 0;
        double totalFuente = 0;
        for (int i = 0; i < listaRubros.size(); i++) {
            for (int j = 0; j < listaRubros.get(i).getListaPeriodos().size(); j++) {
                totalPeriodo = totalPeriodo + listaRubros.get(i).getListaPeriodos().get(j).getValorPeriodo();
                totalPeriodoEst = totalPeriodoEst + listaRubros.get(i).getListaPeriodos().get(j).getValorPeriodoEst();
            }
            listaRubros.get(i).setTotal(totalPeriodo);
            listaRubros.get(i).setTotalAnt(totalPeriodoEst);
            if (idRubroParam != null) {

                if (listaRubros.get(i).getIdRubro() == Integer.parseInt(idRubroParam.getValue().toString())) {
                    for (int k = 0; k < listaRubros.get(i).getListaRubros().size(); k++) {
                        totalFuente = totalFuente + listaRubros.get(i).getListaRubros().get(k).getValorFuenteF();
                    }
                    listaRubros.get(i).setTotalRubro(totalFuente);
                    if (listaRubros.get(i).getTotal() > listaRubros.get(i).getTotalRubro()) {
                        error("El presupuesto a distribuir no puede sobrepasar el presupuesto disponible " + listaRubros.get(i).getTotalRubro() + " para el rubro " + listaRubros.get(i).getNombreRubro());
                        this.recargarListaRubroProy(idRubroParam, periodoParam, valorAnteriorPeriodo);
                    }
                }


            }
            totalPeriodo = 0;
            totalPeriodoEst = 0;
        }
        this.getSesion().setAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "listaRubros", this.getListaRubros());
    }

    protected void calcularPresuApr() {
        double totalFuente = 0;
        double presuApr = 0;
        for (int i = 0; i < listaRubros.size(); i++) {
            for (int j = 0; j < listaRubros.get(i).getListaRubros().size(); j++) {
                totalFuente = totalFuente + listaRubros.get(i).getListaRubros().get(j).getValorFuenteF();

            }
            presuApr = presuApr + totalFuente;
            totalFuente = 0;
        }
        this.setPresupApro(presuApr);
        this.getSesion().setAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "presupApro", this.getPresupApro());
    }

    protected void calcularPresupuestos() {
        double totalPresuApr = 0;
        for (int i = 0; i < listaRubros.size(); i++) {
            totalPresuApr = totalPresuApr + listaRubros.get(i).getTotal();
        }
        this.setPresupDistri(totalPresuApr);
        if (boolPresupuesto == false) {
            if (presupApro < presupDistri) {
                for (int i = 0; i < listaRubros.size(); i++) {
                    for (int j = 0; j < listaRubros.get(i).getListaPeriodos().size(); j++) {
                        listaRubros.get(i).getListaPeriodos().get(j).setValorPeriodo(0);
                    }
                    listaRubros.get(i).setTotal(0);
                }
            } else {
                boolPresupuesto = true;
            }
        }
        this.getSesion().setAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "boolPresupuesto", isBoolPresupuesto());

    }

    protected void recargarListaRubroProy(UIParameter idRubroParam, UIParameter periodoParam, double valorAnteriorPeriodo) {


        for (int i = 0; i < this.getListaRubros().size(); i++) {
            if (this.getListaRubros().get(i).getIdRubro() == Integer.parseInt(idRubroParam.getValue().toString())) {
                for (int j = 0; j < this.getListaRubros().get(i).getListaPeriodos().size(); j++) {
                    if (this.getListaRubros().get(i).getListaPeriodos().get(j).getPeriodo() == Integer.parseInt(periodoParam.getValue().toString())) {
                        this.getListaRubros().get(i).getListaPeriodos().get(j).setValorPeriodo(valorAnteriorPeriodo);
                    }
                }
            }
        }
        this.calcularTotal(null, null, 0);
        this.calcularPresupuestos();
    }

    public void actionInputText(ValueChangeEvent vce) {
        double valorAnteriorPeriodo = Double.parseDouble(vce.getOldValue().toString());
        double valorNuevoPeriodo = Double.parseDouble(vce.getNewValue().toString());
        UIParameter periodoParam = (UIParameter) vce.getComponent().findComponent("periodo");
        UIParameter idRubroParam = (UIParameter) vce.getComponent().findComponent("idRubro");
        for (int i = 0; i < listaRubros.size(); i++) {
            if (listaRubros.get(i).getIdRubro() == Integer.parseInt(idRubroParam.getValue().toString())) {
                for (int j = 0; j < listaRubros.get(i).getListaPeriodos().size(); j++) {
                    if (listaRubros.get(i).getListaPeriodos().get(j).getPeriodo() == Integer.parseInt(periodoParam.getValue().toString())) {
                        listaRubros.get(i).getListaPeriodos().get(j).setValorPeriodo(valorNuevoPeriodo);
                    }
                }
            }
        }
        this.setSwInput(true);
        this.calcularTotal(idRubroParam, periodoParam, valorAnteriorPeriodo);
        this.calcularPresupuestos();
        /*      if (this.getPresupDistri() > this.getPresupApro()) {
        this.recargarListaRubroProy(idRubroParam, periodoParam, valorAnteriorPeriodo);
        }*/
        this.getSesion().setAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "listaRubros", this.getListaRubros());
        this.getSesion().setAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "swInput", this.isSwInput());

    }

    public void actionBontonGuardar() {
        try {
            presupuestosBO.crearPresupPeriodoApr(proyecto, listaRubros);
            this.setBoolBotonGuardar(true);
            this.setBoolBotonSiguiente(false);
            this.setBoolInpuText(true);
            this.getSesion().setAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "boolBotonGuardar", this.isBoolBotonGuardar());
            this.getSesion().setAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "boolBotonSiguiente", this.isBoolBotonSiguiente());
            this.getSesion().setAttribute(ID_SESSION_RUBRO_TIEMPO_APROBADO + "boolInpuText", this.isBoolInpuText());
            info("Se registro correctamente el Presupuesto Aprobado por periodo");
        } catch (Exception ex) {
            Logger.getLogger(RubroTiempoAprobado.class.getName()).log(Level.SEVERE, null, ex);
            error("Error al guardar rubros X periodos por proyecto aprobado");
        }
    }

    public double getValorPeriodo() {
        return valorPeriodo;
    }

    public void setValorPeriodo(double valorPeriodo) {
        this.valorPeriodo = valorPeriodo;
    }

    public List<rubroProyectoVO> getListaRubros() {
        return listaRubros;
    }

    public void setListaRubros(List<rubroProyectoVO> listaRubros) {
        this.listaRubros = listaRubros;
    }

    public int getDuracion() {
        return duracion;
    }

    public void setDuracion(int duracion) {
        this.duracion = duracion;
    }

    public String getTipoPeriodo() {
        return tipoPeriodo;
    }

    public void setTipoPeriodo(String tipoPeriodo) {
        this.tipoPeriodo = tipoPeriodo;
    }

    public HttpSession getSesion() {
        return (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
    }

    public void setSesion(HttpSession sesion) {
        this.sesion = sesion;
    }

    public double getPresupApro() {
        return presupApro;
    }

    public void setPresupApro(double presupApro) {
        this.presupApro = presupApro;
    }

    public long getProyecto() {
        return proyecto;
    }

    public void setProyecto(long proyecto) {
        this.proyecto = proyecto;
    }

    public double getPresupDistri() {
        return presupDistri;
    }

    public void setPresupDistri(double presupDistri) {
        this.presupDistri = presupDistri;
    }

    public boolean isSwInput() {
        return swInput;
    }

    public void setSwInput(boolean swInput) {
        this.swInput = swInput;
    }

    public boolean isBoolBotonGuardar() {
        return boolBotonGuardar;
    }

    public void setBoolBotonGuardar(boolean boolBotonGuardar) {
        this.boolBotonGuardar = boolBotonGuardar;
    }

    public boolean isBoolBotonSiguiente() {
        return boolBotonSiguiente;
    }

    public void setBoolBotonSiguiente(boolean boolBotonSiguiente) {
        this.boolBotonSiguiente = boolBotonSiguiente;
    }

    public boolean isBoolInpuText() {
        return boolInpuText;
    }

    public void setBoolInpuText(boolean boolInpuText) {
        this.boolInpuText = boolInpuText;
    }

    public boolean isBoolPresupuesto() {
        return boolPresupuesto;
    }

    public void setBoolPresupuesto(boolean boolPresupuesto) {
        this.boolPresupuesto = boolPresupuesto;
    }

    /**
     * <p>Callback method that is called whenever a page is navigated to,
     * either directly via a URL, or indirectly via page navigation.
     * Customize this method to acquire resources that will be needed
     * for event handlers and lifecycle methods, whether or not this
     * page is performing post back processing.</p>
     *
     * <p>Note that, if the current request is a postback, the property
     * values of the components do <strong>not</strong> represent any
     * values submitted with this request.  Instead, they represent the
     * property values that were saved for this view when it was rendered.</p>
     */
    @Override
    public void init() {

        // Perform initializations inherited from our superclass
        super.init();
// Perform application initialization that must complete
        // *before* managed components are initialized
        // TODO - add your own initialiation code here
// <editor-fold defaultstate="collapsed" desc="Visual-Web-managed Component Initialization">
// Initialize automatically managed components
        // *Note* - this logic should NOT be modified
        try {
            _init();
        } catch (Exception e) {
            log("Page1 Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e : new FacesException(e);
        }
    }

    /**
     * <p>Callback method that is called after the component tree has been
     * restored, but before any event processing takes place.  This method
     * will <strong>only</strong> be called on a postback request that
     * is processing a form submit.  Customize this method to allocate
     * resources that will be required in your event handlers.</p>
     */
    @Override
    public void preprocess() {
    }

    /**
     * <p>Callback method that is called just before rendering takes place.
     * This method will <strong>only</strong> be called for the page that
     * will actually be rendered (and not, for example, on a page that
     * handled a postback and then navigated to a different page).  Customize
     * this method to allocate resources that will be required for rendering
     * this page.</p>
     */
    @Override
    public void prerender() {
    }

    /**
     * <p>Callback method that is called after rendering is completed for
     * this request, if <code>init()</code> was called (regardless of whether
     * or not this was the page that was actually rendered).  Customize this
     * method to release resources acquired in the <code>init()</code>,
     * <code>preprocess()</code>, or <code>prerender()</code> methods (or
     * acquired during execution of an event handler).</p>
     */
    @Override
    public void destroy() {
    }

    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private void _init() {
    }
}

